<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="../Universal.css">
</head>
<body>
    
    <div id="cnblogs_post_body" class="blogpost-body">
        <h2>IO概述</h2>
    <p>回想之前写过的程序，数据都是在内存中，一旦程序运行结束，这些数据都没有了，等下次再想使用这些数据，可是已经没有了。那怎么办呢？能不能把运算完的数据都保存下来，下次程序启动的时候，再把这些数据读出来继续使用呢？其实要把数据持久化存储，就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘、光盘、U盘等)上。</p>
    <p>当需要把内存中的数据存储到持久化设备上这个动作称为输出（写）Output操作。当把持久设备上的数据读取到内存中的这个动作称为输入（读）Input操作。因此我们把这种输入和输出动作称为IO操作。</p>
    <h2><span style="line-height: 1.5">File类</span></h2>
    <p>File类是File文件和目录路径名的抽象表示形式。即，Java中把文件或者目录（文件夹）都封装成File对象。也就是说如果我们要去操作硬盘上的文件，或者文件夹只要找到File这个类即可。那么我们就要研究研究File这个类中都有那些功能可以操作文件或者文件夹呢？</p>
    <h3>File类的构造函数</h3>
    <p>通过构造方法创建File对象，我们进行演示：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> inter;
    </span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.io.File;
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Demo {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">File构造函数演示</span>
            String pathName = "e:\\java_code\\hello.java"<span style="color: rgba(0, 0, 0, 1)">;
            File f1 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> File(pathName);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将Test22文件封装成File对象。注意；可以封装不存在文件或者文件夹，变成对象。</span>
    <span style="color: rgba(0, 0, 0, 1)">        System.out.println(f1);
            File f2 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> File("e:\\java_code","hello.java"<span style="color: rgba(0, 0, 0, 1)">);
            System.out.println(f2);
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将parent封装成file对象。</span>
            File dir = <span style="color: rgba(0, 0, 255, 1)">new</span> File("e:\\java_code"<span style="color: rgba(0, 0, 0, 1)">);
            File f3 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> File(dir,"hello.java"<span style="color: rgba(0, 0, 0, 1)">);
            System.out.println(f3);
        }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">e:\java_code\hello.java
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> e:\java_code\hello.java
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> e:\java_code\hello.java</span></pre>
    </div>
    <h3><span style="line-height: 1.5">File类的获取</span></h3>
    <p>创建完了File对象之后，那么File类中都有如下常用方法，可以获取文件相关信息</p>
    <p>方法演示如下：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> inter;
    </span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.io.File;
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Demo {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建文件对象</span>
            File file = <span style="color: rgba(0, 0, 255, 1)">new</span> File("Demo.java"<span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取文件的绝对路径，即全路径</span>
            String absPath =<span style="color: rgba(0, 0, 0, 1)"> file.getAbsolutePath();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">File中封装的路径是什么获取到的就是什么。</span>
            String path =<span style="color: rgba(0, 0, 0, 1)"> file.getPath();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取文件名称</span>
            String filename =<span style="color: rgba(0, 0, 0, 1)"> file.getName();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取文件大小</span>
            <span style="color: rgba(0, 0, 255, 1)">long</span> size =<span style="color: rgba(0, 0, 0, 1)"> file.length();
            System.out.println(</span>"absPath="+<span style="color: rgba(0, 0, 0, 1)">absPath);
            System.out.println(</span>"path="+<span style="color: rgba(0, 0, 0, 1)">path);
            System.out.println(</span>"filename="+<span style="color: rgba(0, 0, 0, 1)">filename);
            System.out.println(</span>"size="+<span style="color: rgba(0, 0, 0, 1)">size);
        }
    
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">absPath=F:\编程语言\Java\Project\Projects\typeInfo\Demo.java
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">path=Demo.java
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">filename=Demo.java
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">size=0</span></pre>
    </div>
    <h3><span style="line-height: 1.5">文件和文件夹的创建删除等</span></h3>
    <p>经常上面介绍，我们知道可以通过File获取到文件名称，文件路径(目录)等信息。接下来演示使用File类创建、删除文件等操作。代码<span style="line-height: 1.5">演示：</span></p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> inter;
    
    </span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.io.File;
    </span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.io.IOException;
    
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Demo {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> main(String[] args) <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> IOException {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 对文件或者文件加进行操作。</span>
            File file = <span style="color: rgba(0, 0, 255, 1)">new</span> File("f:\\file.txt"<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建文件，如果文件不存在，创建 true 如果文件存在，则不创建 false。 如果路径错误，IOException。</span>
            <span style="color: rgba(0, 0, 255, 1)">boolean</span> b1 =<span style="color: rgba(0, 0, 0, 1)"> file.createNewFile();
            System.out.println(</span>"b1=" +<span style="color: rgba(0, 0, 0, 1)"> b1);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">-----------删除文件操作-------注意：不去回收站。慎用------</span>
            <span style="color: rgba(0, 0, 255, 1)">boolean</span> b2 =<span style="color: rgba(0, 0, 0, 1)"> file.delete();
            System.out.println(</span>"b2=" +<span style="color: rgba(0, 0, 0, 1)"> b2);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">-----------需要判断文件是否存在------------</span>
            <span style="color: rgba(0, 0, 255, 1)">boolean</span> b3 =<span style="color: rgba(0, 0, 0, 1)"> file.exists();
            System.out.println(</span>"b3=" +<span style="color: rgba(0, 0, 0, 1)"> b3);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">-----------对目录操作 创建，删除，判断------------</span>
            File dir = <span style="color: rgba(0, 0, 255, 1)">new</span> File("f:\\abc"<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">mkdir()创建单个目录。</span>
            <span style="color: rgba(0, 0, 255, 1)">boolean</span> b4 =<span style="color: rgba(0, 0, 0, 1)"> dir.mkdir();
            System.out.println(</span>"b4=" +<span style="color: rgba(0, 0, 0, 1)"> b4);
            File dir1 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> File("f:\\abcd\\ef\\gh"<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">dir.mkdirs();创建多级目录</span>
            <span style="color: rgba(0, 0, 255, 1)">boolean</span> b5 =<span style="color: rgba(0, 0, 0, 1)"> dir1.mkdirs();
            System.out.println(</span>"b5=" +<span style="color: rgba(0, 0, 0, 1)"> b5);
    
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">删除目录时，如果目录中有内容，无法直接删除。</span>
            <span style="color: rgba(0, 0, 255, 1)">boolean</span> b6 =<span style="color: rgba(0, 0, 0, 1)"> dir.delete();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">只有将目录中的内容都删除后，保证该目录为空。这时这个目录才可以删除。</span>
            System.out.println("b6=" +<span style="color: rgba(0, 0, 0, 1)"> b6);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">-----------判断文件，目录------------</span>
            File f = <span style="color: rgba(0, 0, 255, 1)">new</span> File("f:\\javahaha");<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 要判断是否是文件还是目录，必须先判断存在。
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> f.mkdir();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">f.createNewFile();</span>
    <span style="color: rgba(0, 0, 0, 1)">        System.out.println(f.isFile());
            System.out.println(f.isDirectory());
        }
    }
    
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">b1=true
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">b2=true
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">b3=false
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">b4=true
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">b5=true
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">b6=true
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">false
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">false</span></pre>
    </div>
    <h3><span style="line-height: 1.5">listFiles()方法介绍</span></h3>
    <p>文件都存放在目录（文件夹）中，那么如何获取一个目录中的所有文件或者目录中的文件夹呢？</p>
    <p>方法演示如下：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> inter;
    </span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.io.File;
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Demo {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
            File dir </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> File("F:\\源码学习"<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取的是目录下的当前的文件以及文件夹的名称。</span>
            String[] names =<span style="color: rgba(0, 0, 0, 1)"> dir.list();
            </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)">(String name : names){
                System.out.println(name);
            }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取目录下当前文件以及文件对象，只要拿到了文件对象，那么就可以获取其中想要的信息</span>
            File[] files =<span style="color: rgba(0, 0, 0, 1)"> dir.listFiles();
            </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)">(File file : files){
                System.out.println(file);
            }
        }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ace-master.zip
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">nfine-NFine-master
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">nfine-NFine-master.zip
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">SugarSite-master
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">SugarSite-master.zip
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">TaskManager-master
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">TaskManager-master.zip
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">WebDemo.rar
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">websocket聊天室
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定时框架demo源码
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">行动日志
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">路过秋天的开源项目
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\ace-master.zip
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\nfine-NFine-master
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\nfine-NFine-master.zip
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\SugarSite-master
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\SugarSite-master.zip
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\TaskManager-master
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\TaskManager-master.zip
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\WebDemo.rar
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\websocket聊天室
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\定时框架demo源码
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\行动日志
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\路过秋天的开源项目</span></pre>
    </div>
    <p><span style="line-height: 1.5">注意：在获取指定目录下的文件或者文件夹时必须满足下面两个条件</span></p>
    <ul>
    <li>1、指定的目录必须是存在的，</li>
    <li>2、指定的必须是目录。否则容易引发返回数组为null，出现NullPointerException</li>
    </ul>
    <h3>文件过滤器</h3>
    <p>通过listFiles()方法，我们可以获取到一个目录下的所有文件和文件夹，但能不能对其进行过滤呢？比如我们只想要一个目录下的指定扩展名的文件，或者包含某些关键字的文件夹呢？我们是可以先把一个目录下的所有文件和文件夹获取到，并遍历当前获取到所有内容，遍历过程中在进行筛选，但是这个动作有点麻烦，Java给我们提供相应的功能来解决这个问题。查阅File类的API，在查阅时发现File类中重载的listFiles方法，并且接受指定的过滤器。</p>
    <p>测试类</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.io.File;
    </span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.io.FilenameFilter;
    
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Test {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取扩展名为.java所有文件
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建File对象</span>
            File file = <span style="color: rgba(0, 0, 255, 1)">new</span> File("F:\\源码学习"<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取指定扩展名的文件,由于要对所有文件进行扩展名筛选，因此调用方法需要传递过滤器</span>
            File[] files = file.listFiles(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MyFileFilter());
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">遍历获取到的所有符合条件的文件</span>
            <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (File f : files) {
                System.out.println(f);
            }
        }
    }
    </span><span style="color: rgba(0, 0, 255, 1)">class</span> MyFileFilter <span style="color: rgba(0, 0, 255, 1)">implements</span><span style="color: rgba(0, 0, 0, 1)"> FilenameFilter {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> accept(File dir, String name) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> name.endsWith(".zip"<span style="color: rgba(0, 0, 0, 1)">);
        }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\ace-master.zip
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\nfine-NFine-master.zip
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\SugarSite-master.zip
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\TaskManager-master.zip</span></pre>
    </div>
    <h3><span style="line-height: 1.5">自定类继承FilenameFilter过滤器接口</span></h3>
    <p>在查阅API时，我们发现，在listFiles(FileFilter filter) 也可以接受一个FileFilter过滤器，它和我们讲的FilenameFilter有啥区别呢？</p>
    <ul>
    <li>FilenameFilter过滤器中的accept方法接受两个参数，一个当前文件或文件夹所在的路径，一个是当前文件或文件夹对象的名称。</li>
    <li>FileFilter 过滤器中的accept方法接受一个参数，这个参数就当前文件或文件夹对象</li>
    </ul>
    <p>当我们需要过滤文件名称时就可以使用FilenameFilter这个过滤器，当我们想对当前文件或文件夹进行过滤，就可以使用FileFilter ，比如需要当前目录下的所有文件夹，就可以使用FileFilter 过滤器。</p>
    <p>测试类</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.io.File;
    </span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.io.FileFilter;
    
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Test {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取扩展名为.java所有文件
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建File对象</span>
            File file = <span style="color: rgba(0, 0, 255, 1)">new</span> File("F:\\源码学习"<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取指定目录下的文件夹</span>
            File[] files = file.listFiles(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> FileFileterByDir());
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">遍历获取到的所有符合条件的文件</span>
            <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (File f : files) {
               System.out.println(f);
            }
        }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">自定义类继承FileFilter过滤器接口
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">文件过滤器</span>
    <span style="color: rgba(0, 0, 255, 1)">class</span> FileFileterByDir <span style="color: rgba(0, 0, 255, 1)">implements</span><span style="color: rgba(0, 0, 0, 1)"> FileFilter {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> accept(File pathname) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> pathname.isDirectory();
        }
    }
    
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\nfine-NFine-master
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\SugarSite-master
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\TaskManager-master
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\websocket聊天室
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\定时框架demo源码
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\行动日志
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">F:\源码学习\路过秋天的开源项目</span></pre>
    </div>
    <h2><span style="line-height: 1.5">递归</span></h2>
    <p><span style="line-height: 1.5">递归，指在当前方法内调用自己的这种现象。</span><span style="line-height: 1.5">递归分为两种，直接递归和间接递归。</span>直接递归称为方法自身调用自己。间接递归可以A方法调用B方法，B方法调用C方法，C方法调用A方法。</p>
    <p>递归的代码演示，计算1-n之间的和，使用递归完成</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> DiGuiDemo {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">计算1~num的和，使用递归完成</span>
            <span style="color: rgba(0, 0, 255, 1)">int</span> n = 5<span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> sum =<span style="color: rgba(0, 0, 0, 1)"> getSum(n);
            System.out.println(sum);
        }
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">int</span> getSum(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> n) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span>(n == 1<span style="color: rgba(0, 0, 0, 1)">){
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> 1<span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> n + getSum(n-1<span style="color: rgba(0, 0, 0, 1)">);
        }
    }</span></pre>
    </div>
    <p><span style="line-height: 1.5">注意：递归一定要有条件限定，保证递归能够停止下来，否则会发生栈内存溢出。</span>在递归中虽然有限定条件，但是递归次数不能太多。否则也会发生栈内存溢出。</p>
    <p><img src="https://images2015.cnblogs.com/blog/612774/201707/612774-20170717224756771-580753422.jpg" alt=""></p>
    <h3>递归打印所有子目录中的文件路径</h3>
    <p>编写一个方法用来打印指定目录中的文件路径，并进行方法的调用。要求：若指定的目录有子目录，那么把子目录中的文件路径也打印出来。</p>
    <p><span style="line-height: 1.5">代码演示</span></p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.io.File;
    
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Test {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
            File file </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> File("F:\\源码学习\\nfine-NFine-master\\NFine"<span style="color: rgba(0, 0, 0, 1)">);
            getFileAll(file);
        }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取指定目录以及子目录中的所有的文件</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> getFileAll(File file) {
            File[] files </span>=<span style="color: rgba(0, 0, 0, 1)"> file.listFiles();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">遍历当前目录下的所有文件和文件夹</span>
            <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (File f : files) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断当前遍历到的是否为目录</span>
                <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(f.isDirectory()){
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">是目录，继续获取这个目录下的所有文件和文件夹</span>
    <span style="color: rgba(0, 0, 0, 1)">                getFileAll(f);
                }</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">不是目录，说明当前f就是文件，那么就打印出来</span>
    <span style="color: rgba(0, 0, 0, 1)">                System.out.println(f);
                }
            }
        }
    }</span></pre>
    </div>
    <h2>字符编码表</h2>
    <p>我们知道计算机底层数据存储的都是二进制数据，而我们生活中的各种各样的数据，如何才能和计算机中存储的二进制数据对应起来呢？这时老美他们就把每一个字符和一个整数对应起来，就形成了一张编码表，老美他们的编码表就是ASCII表。其中就是各种英文字符对应的编码。</p>
    <p>编码表：其实就是生活中字符和计算机二进制的对应关系表。</p>
    <p>1、ascii： 一个字节中的7位就可以表示。对应的字节都是正数。0-xxxxxxx</p>
    <p>2、iso-8859-1:拉丁码表 latin，用了一个字节用的8位。1-xxxxxxx 负数。</p>
    <p>3、GB2312:简体中文码表。包含6000-7000中文和符号。用两个字节表示。两个字节第一个字节是负数,第二个字节可能是正数</p>
    <ul>
    <li>GBK:目前最常用的中文码表，2万的中文和符号。用两个字节表示，其中的一部分文字，第一个字节开头是1，第二字节开头是0</li>
    <li>GB18030：最新的中文码表，目前还没有正式使用。</li>
    </ul>
    <p>4、unicode：国际标准码表:无论是什么文字，都用两个字节存储。</p>
    <ul>
    <li>Java中的char类型用的就是这个码表。char c = 'a';占两个字节。</li>
    <li>Java中的字符串是按照系统默认码表来解析的。简体中文版 字符串默认的码表是GBK。</li>
    </ul>
    <p>5、UTF-8:基于unicode，一个字节就可以存储数据，不要用两个字节存储，而且这个码表更加的标准化，在每一个字节头加入了编码信息(后期到api中查找)。</p>
    <p>能识别中文的码表：GBK、UTF-8；正因为识别中文码表不唯一，涉及到了编码解码问题。对于我们开发而言；常见的编码 GBK UTF-8 ISO-8859-1</p>
    <p>文字---&gt;(数字) ：编码。 “abc”.getBytes() byte[]</p>
    <p>(数字)---&gt;文字 : 解码。 byte[] b={97,98,99} ；new String(b)</p>
    </div>
    
</body>
</html>